local key = KEYS[1]
local window = tonumber(ARGV[1]) -- 窗口大小
local limit = tonumber(ARGV[2]) -- 限制
local now = tonumber(ARGV[3]) -- 当前时间

--校验传进来的参数是否为空，若为空直接返回错误
if not window or not limit or not now then
    return redis.error_reply('参数错误')
end

window = window * 1000 -- 转换成毫秒

--删除窗口外的数据
redis.call('ZREMRANGEBYSCORE', key, 0, now - window)

--获取当前窗口内的请求数量
-- ZCARD 获取集合中元素的数量
local current = redis.call('ZCARD', key)

--判断当前请求数量是否超出限制
if current >= limit then
    --添加当前请求
    math.randomseed(now)
    local rand = math.random(1000000)
    redis.call('ZADD', key, now , now..'_'..random)
    --更新过期时间
    redis.call('EXPIRE', key, window / 1000)
    return current + 1
else
    return 0
end